package com.lyd.lydblog.util;

import com.alibaba.fastjson.JSON;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

public class FileUtil {

    private final static String encoding = "UTF-8";

    /**
     * 读取配置文件内容转换成json
     * @param path
     * @return
     */
    public FileVO readFileToJson(String path) {
        File file = FileUtils.getFile(path);
        if (!file.exists()){
            throw new RuntimeException("file does not exist");
        }
        try {
            String json = FileUtils.readFileToString(file, encoding);
            json = json.replaceAll("10.120.130.28:1433", "172.16.19.151:5936")
                    .replaceAll("10.120.130.27:1433", "172.16.19.151:5935");
            return JSON.parseObject(json, FileVO.class);
        }catch (IOException e){
            e.printStackTrace();
            throw new RuntimeException("Error reading configuration file");
        }

    }

    /**
     * 读取sql
     * @param path 文件路径
     * @param db 数据库配置信息
     * @param isProc 是不是存储过程之类的脚本
     */
    public void readFile(String path, DBVO db, boolean isProc){
        File file = FileUtils.getFile(path);
        if (!file.exists()){
            throw new RuntimeException("file does not exist");
        }
        if(file.isFile()){
            read(file, db, isProc);
            return;
        }
        direct(file, db, isProc);
    }

    /**
     * 遍历读取文件夹
     * @param direct 文件夹
     * @param db 数据库配置信息
     * @param isProc 是不是存储过程之类的脚本
     */
    private void direct(File direct, DBVO db, boolean isProc) {
        File[] files = direct.listFiles();
        if(files == null || files.length == 0){
            // 没有文件
            return;
        }
        for (File file : files) {
            if(file.isFile()){
                // 是文件  开始读取
                read(file, db, isProc);
            }else{
                // 文件夹 递归调用
                direct(file, db, isProc);
            }
        }
    }

    /**
     * 读取sql文件内容并替换
     * @param file
     * @param db
     * @param isProc
     */
    private void read(File file, DBVO db, boolean isProc) {
        String path = file.getAbsolutePath();
        try {
            String sql = FileUtils.readFileToString(file, encoding);
            // 因为 $ { 为正则表达式的字符  所以需要使用[] 包起来
            sql = sql.replaceAll("[$][{]username}", db.getUsername());
            sql = sql.replaceAll("[$][{]username2}", db.getUsername2());
            // 替换特殊字符
            sql = sql.replaceAll("\uFEFF", "");
//            DatasourceBean datasourceBean = getDatasourceBean(db);
//            DynamicDatasource.execution(datasourceBean, sql, isProc);
        } catch (IOException e){
            System.out.println(String.format(path + " %s, reason： %s", "failure", "error reading configuration file \n"));
        } catch (RuntimeException e){
            System.out.println(String.format("execute sql failure, file path： %s, Version: %s, Username： %s, url：%s, reason： %s \n", path, db.getVersion(), db.getUsername(), db.getUrl(), e.getMessage()));
        }
    }

}
